package TestModelo;

import java.awt.Point;
import java.util.concurrent.CopyOnWriteArrayList;

import modelo.*;
import junit.framework.TestCase;

public class TestEstrategiaEnemiga extends TestCase{
	
	private EstrategiaEnemiga estrategia;
	private Bombita objetivo;
	private Enemigo enemigo;
	private Mapa mapa;
	
	@Override
	public void setUp(){
		objetivo = new Bombita();
		enemigo = new Cecilio();
		mapa = new Mapa(10,10);
		objetivo.setPosicion(new Point(5,5));
		enemigo.setPosicion(new Point(2,2));
		estrategia = new EstrategiaNivelUno(mapa,objetivo,enemigo);		
		
	}
	
	public void testObtenerPosicionesAdyacentes(){
		// la posicion del enemigo es la (2.2)		
		assertEquals(estrategia.posicionAbajo(),new Point(2,1));
		assertEquals(estrategia.posicionArriba(),new Point(2,3));
		assertEquals(estrategia.posicionDerecha(),new Point(3,2));
		assertEquals(estrategia.posicionIzquierda(),new Point(1,2));
	}
	
	public void testPuedeMoverse(){
		assertTrue(estrategia.puedeMoverseA(new Point(3,3)));
	}
	
	public void testPosicionesDentroDeAlcance(){
		// al testear con un objeto del tipo Cecilio, que porta bomba Molotov
		// calculare el alcance de la misma
		enemigo.setPosicion(new Point(6,6));
		estrategia = new EstrategiaNivelUno(mapa,objetivo,enemigo);	
		int alcance = (new BombaMolotov()).getAlcance();
		assertTrue(estrategia.posicionesDentroDeAlcance().contains(new Point(enemigo.getPosicion().x,enemigo.getPosicion().y + alcance)));
		assertTrue(estrategia.posicionesDentroDeAlcance().contains(new Point(enemigo.getPosicion().x,enemigo.getPosicion().y - alcance)));
		assertTrue(estrategia.posicionesDentroDeAlcance().contains(new Point(enemigo.getPosicion().x + alcance,enemigo.getPosicion().y)));
		assertTrue(estrategia.posicionesDentroDeAlcance().contains(new Point(enemigo.getPosicion().x - alcance,enemigo.getPosicion().y)));
	}
	
	public void testPosicionesPosibles(){
		Point posicion1 = new Point(1,2);
		Point posicion2 = new Point(2,3);
		(mapa.obtenerCasillero(posicion1)).agregarContenido(new BloqueAcero());
		(mapa.obtenerCasillero(posicion2)).agregarContenido(new BloqueAcero());
		assertTrue(!estrategia.posicionesPosibles().contains(posicion1));
		assertTrue(!estrategia.posicionesPosibles().contains(posicion2));	

	}

	
	public void testMoverse(){
		int velocidad = 3;
		int contadorDeTicks = 0;
		Point posicion = enemigo.getPosicion();
		enemigo.setVelocidad(velocidad);
		for (int index = 1; index <= velocidad; index ++){
			estrategia.moverse();
			contadorDeTicks++;
		}
		
		assertTrue(!(enemigo.getPosicion() != posicion));
	}

    public void testCrearArmaCOnDestino(){
    	CopyOnWriteArrayList<Contenido> objetosVivos = new CopyOnWriteArrayList<Contenido>();
    	estrategia.crearArmaConDestino(objetosVivos);
    	assertTrue(objetosVivos.size() > 0);
    	// me aseguro que el objeto agregado a la lista de objetos vivos sea una Bomba Molotov
    	// ya que el enemigo, Cecilio, posee ese tipo de bomba
    	assertTrue(objetosVivos.get(0).getClass() == BombaMolotov.class);
    }

}
